/* Hello, Emacs, this is -*-C-*- */

/* Prescribe (KYOCERA) driver - Michael Waldor */

/*[
 * Copyright 1990 - 1993, 1998, 2004
 *
 * Permission to use, copy, and distribute this software and its
 * documentation for any purpose with or without fee is hereby granted,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.
 *
 * Permission to modify the software is granted, but not the right to
 * distribute the complete modified source code.  Modifications are to
 * be distributed as patches to the released version.  Permission to
 * distribute binaries produced by compiling modified sources is granted,
 * provided you
 *   1. distribute the corresponding source modifications from the
 *    released version in the form of a patch file along with the binaries,
 *   2. add special version identification to distinguish your version
 *    in addition to the base release version number,
 *   3. provide your name and address as the primary contact for the
 *    support of your modified version, and
 *   4. retain our contact information in regard to use of the base
 *    software.
 * Permission to distribute the released version of the source code along
 * with corresponding source modifications in the form of a patch file is
 * granted with same provisions 2 through 4 for binary distributions.
 *
 * This software is provided "as is" without express or implied warranty
 * to the extent permitted by applicable law.
]*/

/* Modified for gnuplot 2.0 sk@sun4 24-Apr-1990 13:23 */

/*
 * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
 */

#include "driver.h"

#ifdef TERM_REGISTER
register_term(prescribe)
register_term(kyo)
#endif

#ifdef TERM_PROTO
TERM_PUBLIC void PRE_init(void);
TERM_PUBLIC void KYO_init(void);
TERM_PUBLIC void PRE_graphics(void);
TERM_PUBLIC void PRE_text(void);
TERM_PUBLIC void PRE_linetype(int linetype);
TERM_PUBLIC void PRE_move(unsigned int x, unsigned int y);
TERM_PUBLIC void PRE_vector(unsigned int x, unsigned int y);
TERM_PUBLIC void PRE_put_text(unsigned int x, unsigned int y, const char *str);
TERM_PUBLIC int PRE_justify_text(enum JUSTIFY mode);
TERM_PUBLIC void PRE_reset(void);

#define PRE_XMAX 2567
#define PRE_YMAX 1815		/* X:Y = sqrt(2) */

#define PRE_VCHAR (PRE_YMAX/30)
#define PRE_HCHAR 33		/* about 9 chars per inch */
#define PRE_HTIC (PRE_XMAX/80)
#define PRE_VTIC PRE_HTIC

/* for Courier font: */
#define KYO_VCHAR (14*(300/72))	/* 12 pt + 2 pt baselineskip */
#define KYO_HCHAR (300/10)	/*  10 chars per inch */
#endif /* TERM_PROTO */

#ifndef TERM_PROTO_ONLY
#ifdef TERM_BODY

#define PRE_XLAST (PRE_XMAX - 1)
#define PRE_YLAST (PRE_YMAX - 1)

enum JUSTIFY pre_justify = LEFT;	/* text is flush left */

TERM_PUBLIC void
PRE_init()
{
    fputs("!R! RES;\n", gpoutfile);
    /* UNIT: units are dots, 300 dots = 1 in = 72 pt */
    /* SPO: landscape format */
    /* STM, SLM set top, left margin */
    /* Font: bold Helvetica (proportional font) */
    fputs("PAGE; UNIT D; SPO L; STM 280; SLM 440;\n", gpoutfile);
    fputs("FTMD 15; FONT 29; SCPI 9;\n", gpoutfile);
}

TERM_PUBLIC void
KYO_init()
{
    fputs("!R! RES;\n", gpoutfile);
    /* UNIT: units are dots, 300 dots = 1 in = 72 pt */
    /* SPO: landscape format */
    /* STM, SLM set top, left margin */
    /* Font: Courier (fixed width font) */
    fputs("PAGE; UNIT D; SPO L; STM 280; SLM 440;\n", gpoutfile);
    fputs("FTMD 15; FONT 17; SCPI 10;\n", gpoutfile);
}

TERM_PUBLIC void
PRE_graphics()
{
}

TERM_PUBLIC void
PRE_text()
{				/* eject page after each plot */
    fputs("PAGE;\n", gpoutfile);
}

TERM_PUBLIC void
PRE_linetype(int linetype)
{
    /* actually choose pendiameter */
    if (linetype < 0)
	linetype = -linetype;
    else
	linetype = 3;
    (void) fprintf(gpoutfile, "SPD %d;\n", linetype);
}

TERM_PUBLIC void
PRE_move(unsigned int x, unsigned int y)
{
    (void) fprintf(gpoutfile, "MAP %1d,%1d;\n", x, PRE_YMAX - y);
}

TERM_PUBLIC void
PRE_vector(unsigned int x, unsigned int y)
{
    (void) fprintf(gpoutfile, "DAP %1d, %1d;\n", x, PRE_YMAX - y);
}

TERM_PUBLIC void
PRE_put_text(unsigned int x, unsigned int y, const char *str)
{
    PRE_move(x, y);
    switch (pre_justify) {
    case RIGHT:
	(void) fprintf(gpoutfile, "RTXT \"%s\", B;\n", str);
	break;
    default:
	(void) fprintf(gpoutfile, "TEXT \"%s\", B;\n", str);
    }
}

TERM_PUBLIC int
PRE_justify_text(enum JUSTIFY mode)
{
    pre_justify = mode;
    switch (pre_justify) {
    case LEFT:
    case RIGHT:
	return (TRUE);
    default:
	return (FALSE);
    }

}

TERM_PUBLIC void
PRE_reset()
{
    fputs("PAGE; RES; EXIT;\n", gpoutfile);
}

#endif /* TERM_BODY */

#ifdef TERM_TABLE
TERM_TABLE_START(prescribe_driver)
    "prescribe", "Prescribe - for the Kyocera Laser Printer",
    PRE_XMAX, PRE_YMAX, PRE_VCHAR, PRE_HCHAR,
    PRE_VTIC, PRE_HTIC, options_null, PRE_init, PRE_reset,
    PRE_text, null_scale, PRE_graphics, PRE_move, PRE_vector,
    PRE_linetype, PRE_put_text, null_text_angle,
    PRE_justify_text, line_and_point, do_arrow, set_font_null
TERM_TABLE_END(prescribe_driver)

#undef LAST_TERM
#define LAST_TERM prescribe_driver

TERM_TABLE_START(kyo_driver)
    "kyo", "Kyocera Laser Printer with Courier font",
    PRE_XMAX, PRE_YMAX, KYO_VCHAR, KYO_HCHAR,
    PRE_VTIC, PRE_HTIC, options_null, KYO_init, PRE_reset,
    PRE_text, null_scale, PRE_graphics, PRE_move, PRE_vector,
    PRE_linetype, PRE_put_text, null_text_angle,
    PRE_justify_text, line_and_point, do_arrow, set_font_null
TERM_TABLE_END(kyo_driver)

#undef LAST_TERM
#define LAST_TERM kyo_driver

#endif /* TERM_TABLE */
#endif /* TERM_PROTO_ONLY */

#ifdef TERM_HELP
START_HELP(kyo)
"1 kyo",
"?commands set terminal kyo",
"?set terminal kyo",
"?set term kyo",
"?terminal kyo",
"?term kyo",
"?kyo",
"?commands set terminal prescribe",
"?set terminal prescribe",
"?set term prescribe",
"?terminal prescribe",
"?term prescribe",
"?prescribe",
" The `kyo` and `prescribe` terminal drivers support the Kyocera laser printer.",
" The only difference between the two is that `kyo` uses \"Helvetica\" whereas",
" `prescribe` uses \"Courier\".  There are no options.  Note: legacy terminal."
END_HELP(kyo)
#endif
